#include <stdio.h>
#include <stdlib.h> //堆

int main()
{
    // 申请堆上空间可能会失败，返回空指针
    // int *p = (int*)malloc(4); //返回值是void* ，所以使用(int*)强转一下 4字节 一个int型
    // if(p==NULL)
    // {
    //     printf("malloc 申请空间失败!\n");
    //     return -1;
    // }
    // *p = 20;
    // printf("%d\n",*p);
    // free(p); //释放堆上内存

    // 申请数组
    //  int *p=(int *)malloc(sizeof(int) * 10); //
    //  if(p==NULL)
    //  {
    //      printf("malloc 申请空间失败!\n"); // 申请10个int大小的内存
    //      return -1;
    //  }
    //  for(int i = 0;i<10;i++)
    //  {
    //      p[i]=i+1;
    //  }
    //  for(int i = 0;i<10;i++)
    //  {
    //      printf("%d ",p[i]);
    //  }
    //  printf("\n");
    //  free(p);

    // 申请二维数组
    // 二级指针 用指针数组
    int **p = (int **)malloc(sizeof(int *) * 2); // 申请两行三列的二维数组
    if (p == NULL)
    {
        printf("malloc 申请空间失败!\n");
        return -1;
    }
    for (int i = 0; i < 2; i++)
    {
        p[i] = (int *)malloc(sizeof(int) * 3);
        if (p == NULL)
        {
            printf("malloc 申请空间失败!\n");
            return -1;
        }
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            p[i][j] = i * 3 + j + 1; // 可以顺序赋值 1 2 3 4 5....
        }
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }
    for (int i = 0; i < 2; i++)
    {
        free(p[i]);  // 释放指向的里面的一维数组
    }
    free(p);   // 释放外层的一维数组
    return 0;
}
